/* Filename: creat1.c
 * No.83-84.线程-线程创建&线程终止和栈清理
 * $ ps axm
 * $ ps ax -L
 * Description:
 * $ gcc -Wall creat1.c -o creat1 -lpthread
 * Last modified: humble 2020-09-01 15:29:48
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
//#include <unistd.h>

static void *func(void *p)
{
    printf("func %d\n", *(int *)p);
    pthread_exit(3);
    //pthread_exit(NULL);
    //return NULL; //pthread_exit可以实现线程清理，retuan NULL不可以
}

int main(int argc, char **argv)
{
    int i = 2;
    int retval = -1;
    pthread_t tid;

    puts("begin");
    int err = pthread_create(&tid, NULL, func, (void *)&i);
    if(err){
        fprintf(stderr, "pthread_create():%s\n", strerror(err));
        exit(1);
    }

    //线程的调度取决于调度器的策略
    //调用pthread_create后，可能main线程先往下运行，也可能func线程先运行
    //所以"func 7"和"main"打印顺序可能不确定

    //sleep(1);
    puts("main");

    //为tid收尸，并用retval接收tid返回值
    pthread_join(tid, &retval); //类似进程的wati()

    printf("end %d\n", retval);
    return 0;
}
